تجاوز الفحوصات اليدوية في DevTools. يشرح هذا الدليل كيفية أتمتة تحليل أداء JavaScript وإعداد المراقبة المستمرة في خط أنابيب CI/CD الخاص بك لضمان تجربة سريعة لجميع المستخدمين في كل مكان.
خط الأنابيب الاستباقي: أتمتة أداء JavaScript لجمهور عالمي
في الاقتصاد الرقمي، السرعة لغة عالمية. فالمستخدم في طوكيو أو لندن أو ساو باولو لديه نفس التوقع: تجربة رقمية سريعة وسلسة. عندما يتعثر تطبيق ويب أو يتجمد أو يستغرق ثوانٍ للتحميل، فهذا ليس مجرد إزعاج؛ بل هو خرق لهذا التوقع. هذا هو القاتل الصامت لتفاعل المستخدم ومعدلات التحويل وسمعة العلامة التجارية. لسنوات، كان تحليل الأداء تخصصًا تفاعليًا — غوص عميق ومحموم في أدوات مطوري Chrome بعد أن يبدأ المستخدمون بالشكوى. لم يعد هذا النهج مستدامًا في عالم النشر المستمر وقواعد المستخدمين العالمية.
مرحبًا بكم في خط الأنابيب الاستباقي. هذا تحول نموذجي من الفحوصات اليدوية المخصصة للأداء إلى عملية منهجية ومؤتمتة ومستمرة للمراقبة والتنفيذ. يتعلق الأمر بترسيخ الأداء كمبدأ أساسي في دورة حياة التطوير الخاصة بك، تمامًا مثل اختبار الوحدات أو فحص الأمان. من خلال أتمتة تحليل أداء JavaScript، يمكنك اكتشاف التراجعات قبل وصولها إلى بيئة الإنتاج، واتخاذ قرارات تحسين مدعومة بالبيانات، وضمان حصول كل مستخدم، بغض النظر عن موقعه أو جهازه، على أفضل تجربة ممكنة.
سيرشدك هذا الدليل الشامل إلى أسباب وماهية وكيفية بناء خط أنابيب المراقبة المستمرة للأداء الخاص بك. سنستكشف الأدوات، ونحدد المقاييس المهمة، ونقدم أمثلة عملية حول كيفية دمج هذه الفحوصات مباشرة في سير عمل CI/CD الخاص بك.
من التحليل اليدوي إلى الرؤى المؤتمتة: تطور ضروري
معظم مطوري الواجهات الأمامية على دراية بعلامتي التبويب Performance و Lighthouse في أدوات المطورين في متصفحاتهم. هذه أدوات قوية بشكل لا يصدق لتشخيص المشكلات في صفحة معينة. لكن الاعتماد عليها وحدها يشبه محاولة ضمان السلامة الهيكلية لناطحة سحاب عن طريق فحص دعامة واحدة فقط مرة واحدة في السنة.
محدودية التحليل اليدوي
- إنه تفاعلي وليس استباقيًا: تحدث الفحوصات اليدوية عادةً عندما يتم تحديد مشكلة بالفعل. أنت تصلح حريقًا، لا تمنعه. بحلول الوقت الذي يفتح فيه المطور DevTools للتحقيق في تباطؤ، يكون المستخدمون قد شعروا بالألم بالفعل.
- إنه غير متسق: النتائج التي تحصل عليها على جهاز تطوير متطور متصل بشبكة مكتب سريعة تختلف اختلافًا كبيرًا عما يختبره المستخدم على جهاز محمول متوسط المدى في منطقة ذات اتصال متقطع. تفتقر الاختبارات اليدوية إلى بيئة خاضعة للرقابة وقابلة للتكرار.
- يستغرق وقتًا طويلاً وغير قابل للتطوير: يتطلب تحليل الأداء الشامل وقتًا وخبرة كبيرين. مع نمو التطبيق في التعقيد وحجم الفريق، يصبح من المستحيل على المطورين فحص كل تغيير (commit) يدويًا بحثًا عن تراجعات في الأداء.
- يخلق صوامع معرفية: غالبًا ما يمتلك عدد قليل فقط من 'أبطال الأداء' في الفريق الخبرة العميقة لتفسير مخططات اللهب (flame charts) وملفات التتبع المعقدة، مما يخلق عنق زجاجة لجهود التحسين.
مبررات الأتمتة والمراقبة المستمرة
تحوّل أتمتة تحليل الأداء العملية من تدقيق عرضي إلى حلقة تغذية راجعة مستمرة. هذا النهج، الذي يطلق عليه غالبًا "المراقبة الاصطناعية" (Synthetic Monitoring) في سياق CI/CD، يقدم مزايا عميقة.
- اكتشاف التراجعات مبكرًا: من خلال تشغيل اختبارات الأداء على كل تغيير (commit) أو طلب سحب (pull request)، يمكنك على الفور تحديد التغيير الدقيق الذي أدى إلى التباطؤ. هذا النهج "التحول إلى اليسار" (shift left) يجعل إصلاح المشكلات أرخص وأسرع بشكل كبير.
- إنشاء خط أساس للأداء: تتيح لك الأتمتة بناء سجل تاريخي لأداء تطبيقك. هذه البيانات الاتجاهية لا تقدر بثمن لفهم التأثير طويل المدى للتطوير واتخاذ قرارات مستنيرة بشأن الديون التقنية.
- فرض ميزانيات الأداء: تجعل الأتمتة من الممكن تحديد وفرض "ميزانية أداء" — مجموعة من العتبات للمقاييس الرئيسية التي يجب أن يفي بها البناء (build) للنجاح. إذا تسبب تغيير ما في إبطاء أكبر عرض للمحتوى (LCP) بنسبة 20%، يمكن أن يفشل البناء تلقائيًا، مما يمنع نشر التراجع.
- إضفاء الطابع الديمقراطي على الأداء: عندما يتم تقديم ملاحظات الأداء تلقائيًا ضمن سير عمل المطور الحالي (على سبيل المثال، تعليق على طلب سحب)، فإنها تمكن كل مهندس من تولي مسؤولية الأداء. لم تعد مسؤولية متخصص فقط.
المفاهيم الأساسية للمراقبة المستمرة للأداء
قبل الغوص في الأدوات، من الضروري فهم المفاهيم الأساسية التي تشكل حجر الأساس لأي استراتيجية ناجحة لمراقبة الأداء.
مقاييس الأداء الرئيسية التي يجب تتبعها ("ماذا")
لا يمكنك تحسين ما لا تقيسه. في حين أن هناك العشرات من المقاييس المحتملة، فإن التركيز على عدد قليل من المقاييس التي تركز على المستخدم هو الاستراتيجية الأكثر فعالية. تعد مؤشرات أداء الويب الأساسية من Google نقطة انطلاق ممتازة لأنها مصممة لقياس تجربة المستخدم في العالم الحقيقي.
- أكبر عرض للمحتوى (LCP): يقيس أداء التحميل. يحدد النقطة في الجدول الزمني لتحميل الصفحة التي يُحتمل أن يكون المحتوى الرئيسي قد تم تحميله فيها. يعتبر LCP جيدًا عند 2.5 ثانية أو أقل.
- التفاعل حتى العرض التالي (INP): يقيس التفاعلية. يقوم INP بتقييم استجابة الصفحة بشكل عام لتفاعلات المستخدم. يراقب زمن انتقال جميع النقرات واللمسات وتفاعلات لوحة المفاتيح. يعتبر INP جيدًا عندما يكون أقل من 200 مللي ثانية. (لقد حل INP محل تأخير الإدخال الأول (FID) كمؤشر أساسي لأداء الويب في مارس 2024).
- متغيّر التصميم التراكمي (CLS): يقيس الاستقرار البصري. يحدد كمية تغيّر التصميم غير المتوقع الذي يواجهه المستخدمون. درجة CLS جيدة هي 0.1 أو أقل.
بالإضافة إلى مؤشرات أداء الويب الأساسية، تشمل المقاييس الهامة الأخرى:
- زمن وصول أول بايت (TTFB): يقيس وقت استجابة الخادم. وهو مقياس أساسي لأن TTFB البطيء سيؤثر سلبًا على جميع المقاييس اللاحقة.
- أول عرض للمحتوى (FCP): يحدد الوقت الذي يتم فيه عرض أول جزء من محتوى DOM. يوفر أول رد فعل للمستخدم بأن الصفحة قيد التحميل بالفعل.
- إجمالي وقت الحظر (TBT): يقيس إجمالي الوقت بين FCP والوقت حتى التفاعل (TTI) حيث تم حظر الخيط الرئيسي لفترة كافية لمنع استجابة الإدخال. إنه مقياس مختبري رائع يرتبط جيدًا بـ INP.
تحديد ميزانية الأداء ("لماذا")
ميزانية الأداء هي مجموعة واضحة من القيود التي يوافق فريقك على العمل ضمنها. إنها ليست مجرد هدف؛ بل هي حد صارم. تحول الميزانية الأداء من هدف غامض "لنجعله سريعًا" إلى متطلب ملموس وقابل للقياس لتطبيقك.
قد تبدو ميزانية الأداء البسيطة كما يلي:
- يجب أن يكون LCP أقل من 2.5 ثانية.
- يجب أن يكون TBT أقل من 200 مللي ثانية.
- يجب ألا يتجاوز الحجم الإجمالي لحزمة JavaScript 250 كيلوبايت (بعد الضغط gzipped).
- يجب أن تكون درجة أداء Lighthouse 90 أو أعلى.
من خلال تحديد هذه الحدود، يكون لدى خط الأنابيب المؤتمت الخاص بك معيار واضح للنجاح/الفشل. إذا تسبب طلب سحب في انخفاض درجة Lighthouse إلى 85، يفشل فحص CI، ويتم إخطار المطور على الفور — قبل دمج الكود.
خط أنابيب مراقبة الأداء ("كيف")
يتبع خط أنابيب الأداء المؤتمت النموذجي هذه الخطوات:
- الزناد (Trigger): يقوم مطور بتثبيت (commit) كود جديد في نظام التحكم في الإصدار (مثل Git).
- البناء (Build): يقوم خادم CI/CD (مثل GitHub Actions, Jenkins, GitLab CI) بسحب الكود وتشغيل عملية بناء التطبيق.
- النشر والاختبار (Deploy & Test): يتم نشر التطبيق في بيئة مؤقتة أو بيئة معاينة. ثم تقوم أداة مؤتمتة بتشغيل مجموعة من اختبارات الأداء على هذه البيئة.
- التحليل والتأكيد (Analyze & Assert): تجمع الأداة مقاييس الأداء وتقارنها بميزانية الأداء المحددة مسبقًا.
- الإبلاغ والإجراء (Report & Action): إذا تم الوفاء بالميزانية، ينجح الفحص. إذا لم يتم، يفشل البناء، ويتم إرسال تنبيه إلى الفريق مع تقرير مفصل يشرح التراجع.
مجموعة الأدوات الحديثة لتحليل JavaScript المؤتمت
تشكل العديد من الأدوات مفتوحة المصدر الممتازة العمود الفقري لأتمتة الأداء الحديثة. دعنا نستكشف أبرزها.
أتمتة المتصفح باستخدام Playwright و Puppeteer
Playwright (من Microsoft) و Puppeteer (من Google) هما مكتبتا Node.js توفران واجهة برمجة تطبيقات عالية المستوى للتحكم في متصفحات Chrome و Firefox و WebKit بدون واجهة رسومية (headless). في حين أنها تستخدم غالبًا للاختبار الشامل (end-to-end)، إلا أنها رائعة أيضًا لتحليل الأداء.
يمكنك استخدامها لكتابة سيناريوهات تفاعلات مستخدم معقدة وجمع تتبعات أداء مفصلة يمكن تحليلها في DevTools. هذا مثالي لقياس أداء رحلة مستخدم معينة، وليس فقط تحميل الصفحة الأولي.
إليك مثال بسيط باستخدام Playwright لإنشاء ملف تتبع الأداء:
مثال: إنشاء ملف تتبع باستخدام Playwright
const { chromium } = require('playwright');(async () => {const browser = await chromium.launch({ headless: true });const page = await browser.newPage();// ابدأ التتبع، مع الحفظ في ملف.await page.tracing.start({ path: 'performance-trace.json', screenshots: true });await page.goto('https://your-app.com/dashboard');// تفاعل مع الصفحة لتحليل أداء إجراء معينawait page.click('button#load-data-button');await page.waitForSelector('.data-grid-loaded'); // انتظر النتيجة// أوقف التتبعawait page.tracing.stop();await browser.close();console.log('Performance trace saved to performance-trace.json');})();
يمكنك بعد ذلك تحميل ملف `performance-trace.json` في لوحة الأداء في Chrome DevTools للحصول على تحليل غني، إطارًا بإطار، لما حدث أثناء تفاعل المستخدم هذا. في حين أن هذه أداة تشخيص قوية، فإننا نحتاج إلى طبقة أخرى للتأكيد المؤتمت: Lighthouse.
الاستفادة من Google Lighthouse لإجراء تدقيقات شاملة
Lighthouse هي الأداة مفتوحة المصدر القياسية في الصناعة لتدقيق جودة صفحات الويب. تقوم بتشغيل مجموعة من الاختبارات على الصفحة وتنشئ تقريرًا عن الأداء، وإمكانية الوصول، وأفضل الممارسات، وتحسين محركات البحث (SEO). والأهم من ذلك بالنسبة لخط الأنابيب الخاص بنا، يمكن تشغيلها برمجيًا وتكوينها لفرض ميزانيات الأداء.
أفضل طريقة لدمج Lighthouse في خط أنابيب CI/CD هي باستخدام Lighthouse CI. إنها مجموعة من الأدوات التي تبسط تشغيل Lighthouse، وتأكيد النتائج مقابل الميزانيات، وتتبع الدرجات بمرور الوقت.
للبدء، ستقوم بإنشاء ملف تكوين باسم `lighthouserc.js` في جذر مشروعك:
مثال: إعدادات ملف lighthouserc.js
module.exports = {ci: {collect: {// الخيار 1: التشغيل على رابط URL مباشر// url: ['https://staging.your-app.com'],// الخيار 2: التشغيل على مخرجات بناء يتم تقديمها محليًاstaticDistDir: './build',startServerCommand: 'npm run start:static',},assert: {preset: 'lighthouse:recommended', // ابدأ بالإعدادات الافتراضية المعقولةassertions: {// تأكيدات مخصصة (ميزانية الأداء الخاصة بك)'categories:performance': ['error', { minScore: 0.9 }], // يجب أن تكون النتيجة >= 90'categories:accessibility': ['warn', { minScore: 0.95 }], // يجب أن تكون النتيجة >= 95'core-web-vitals/largest-contentful-paint': ['error', { maxNumericValue: 2500 }],'core-web-vitals/total-blocking-time': ['error', { maxNumericValue: 200 }],},},upload: {target: 'temporary-public-storage', // أسهل طريقة للبدء},},};
مع هذا التكوين، يمكنك تشغيل `lhci autorun` من سطر الأوامر أو من خلال سكربت CI. سيقوم تلقائيًا ببدء الخادم الخاص بك، وتشغيل Lighthouse عدة مرات للاستقرار، والتحقق من النتائج مقابل تأكيداتك، والفشل إذا لم يتم الوفاء بالميزانية.
المراقبة الاصطناعية مقابل مراقبة المستخدم الحقيقي (RUM)
من الأهمية بمكان فهم الفرق بين النوعين الرئيسيين لمراقبة الأداء.
- المراقبة الاصطناعية (بيانات المختبر): هذا ما كنا نناقشه — تشغيل اختبارات مؤتمتة في بيئة خاضعة للرقابة ومتسقة ("المختبر"). إنها مثالية لـ CI/CD لأنها تعزل تأثير تغييرات الكود الخاصة بك. أنت تتحكم في سرعة الشبكة ونوع الجهاز والموقع. قوتها تكمن في الاتساق واكتشاف التراجعات.
- مراقبة المستخدم الحقيقي (RUM) (بيانات الحقل): يتضمن ذلك جمع بيانات الأداء من متصفحات المستخدمين الفعلية حول العالم ("الحقل"). تستخدم أدوات RUM (مثل Sentry أو Datadog أو New Relic) قصاصة JavaScript صغيرة على موقعك للإبلاغ عن مؤشرات أداء الويب الأساسية والمقاييس الأخرى كما يختبرها الأشخاص الحقيقيون. قوتها تكمن في توفير صورة حقيقية لتجربة المستخدم العالمية عبر مجموعات لا حصر لها من الأجهزة والشبكات.
الاثنان لا يستبعد أحدهما الآخر؛ بل هما متكاملان. استخدم المراقبة الاصطناعية في خط أنابيب CI/CD الخاص بك لمنع نشر التراجعات على الإطلاق. استخدم RUM في بيئة الإنتاج لفهم تجربة المستخدمين الفعلية وتحديد مجالات التحسين التي قد تفوتها اختبارات المختبر الخاصة بك.
دمج تحليل الأداء في خط أنابيب CI/CD الخاص بك
النظرية رائعة، لكن التنفيذ العملي هو ما يهم. لنبني فحص أداء بسيطًا باستخدام Lighthouse CI ضمن سير عمل GitHub Actions.
مثال عملي مع GitHub Actions
سيعمل سير العمل هذا على كل طلب سحب. يقوم ببناء التطبيق، وتشغيل Lighthouse CI عليه، ونشر النتائج كتعليق على طلب السحب.
أنشئ ملفًا في `.github/workflows/performance-ci.yml`:
مثال: .github/workflows/performance-ci.yml
name: CI للأداءon: [pull_request]jobs:lighthouse:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: استخدام Node.js 20.xuses: actions/setup-node@v3with:node-version: '20.x'cache: 'npm'- name: تثبيت التبعياتrun: npm ci- name: بناء أصول الإنتاجrun: npm run build- name: تشغيل Lighthouse CIrun: |npm install -g @lhci/cli@0.12.xlhci autorunenv:LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
لجعل هذا يعمل، تحتاج إلى شيئين:
- ملف `lighthouserc.js` في مستودعك، كما هو موضح في القسم السابق.
- تطبيق Lighthouse CI GitHub مثبت على مستودعك. يسمح هذا لـ Lighthouse CI بنشر التعليقات وفحوصات الحالة. ستحصل على رمز مميز (`LHCI_GITHUB_APP_TOKEN`) أثناء التثبيت، والذي يجب عليك حفظه كسر (secret) في إعدادات مستودع GitHub الخاص بك.
الآن، عندما يفتح مطور طلب سحب، سيظهر فحص للحالة. إذا فشلت ميزانية الأداء، سيكون الفحص باللون الأحمر. سيتم نشر تعليق مفصل مع درجات Lighthouse، يوضح بالضبط المقاييس التي تراجعت.
تخزين وتصور بيانات الأداء
في حين أن `temporary-public-storage` رائع للبدء، إلا أنك ستحتاج إلى تخزين تقارير Lighthouse الخاصة بك للتحليل طويل المدى. خادم Lighthouse CI هو حل مجاني ومفتوح المصدر يمكنك استضافته بنفسك. يوفر لوحة معلومات لتصور اتجاهات الأداء بمرور الوقت، ومقارنة التقارير بين الفروع، وتحديد التدهور التدريجي في الأداء الذي قد يتم تفويته في تشغيل واحد.
تكوين ملف `lighthouserc.js` الخاص بك للتحميل إلى خادمك الخاص أمر بسيط. هذه البيانات التاريخية تحول خط الأنابيب الخاص بك من حارس بوابة بسيط إلى أداة تحليل قوية.
التنبيه وإعداد التقارير
القطعة الأخيرة من اللغز هي التواصل الفعال. لا يكون البناء الفاشل مفيدًا إلا إذا تم إخطار الأشخاص المناسبين على الفور. بالإضافة إلى فحوصات الحالة في GitHub، فكر في إعداد تنبيهات في قناة الاتصال الرئيسية لفريقك، مثل Slack أو Microsoft Teams. يجب أن يتضمن التنبيه الجيد ما يلي:
- طلب السحب أو التغيير (commit) المحدد الذي تسبب في الفشل.
- أي مقياس (مقاييس) أداء انتهك الميزانية وبأي قدر.
- رابط مباشر إلى تقرير Lighthouse الكامل لتحليل أعمق.
استراتيجيات متقدمة واعتبارات عالمية
بمجرد أن يكون لديك خط أنابيب أساسي، يمكنك تحسينه ليعكس بشكل أفضل قاعدة المستخدمين العالمية لديك.
محاكاة ظروف الشبكة ووحدة المعالجة المركزية المتنوعة
ليس كل المستخدمين لديك يستخدمون اتصالات ألياف بصرية بمعالجات متطورة. من الضروري الاختبار في ظل ظروف أكثر واقعية. يحتوي Lighthouse على ميزة تقييد (throttling) مدمجة تحاكي شبكة ووحدة معالجة مركزية أبطأ بشكل افتراضي (تحاكي جهازًا محمولًا متوسط المستوى على اتصال 4G).
يمكنك تخصيص هذه الإعدادات في تكوين Lighthouse الخاص بك لاختبار مجموعة من السيناريوهات، مما يضمن بقاء تطبيقك قابلاً للاستخدام للعملاء في الأسواق ذات البنية التحتية للإنترنت الأقل تطورًا.
تحليل رحلات مستخدم محددة
تحميل الصفحة الأولي هو جزء واحد فقط من تجربة المستخدم. ماذا عن أداء إضافة عنصر إلى عربة التسوق، أو استخدام مرشح بحث، أو إرسال نموذج؟ يمكنك الجمع بين قوة Playwright و Lighthouse لتحليل هذه التفاعلات الحاسمة.
النمط الشائع هو استخدام سكربت Playwright للانتقال بالتطبيق إلى حالة معينة (على سبيل المثال، تسجيل الدخول، إضافة عناصر إلى عربة التسوق) ثم تسليم التحكم إلى Lighthouse لتشغيل تدقيقه على حالة الصفحة تلك. يوفر هذا رؤية أكثر شمولية لأداء تطبيقك.
الخلاصة: بناء ثقافة الأداء
إن أتمتة مراقبة أداء JavaScript لا تتعلق فقط بالأدوات والسكربتات؛ بل تتعلق بتعزيز ثقافة يكون فيها الأداء مسؤولية مشتركة. عندما يتم التعامل مع الأداء كميزة من الدرجة الأولى، قابلة للقياس وغير قابلة للتفاوض، يصبح جزءًا لا يتجزأ من عملية التطوير بدلاً من كونه فكرة لاحقة.
من خلال الانتقال من نهج تفاعلي يدوي إلى خط أنابيب استباقي مؤتمت، يمكنك تحقيق العديد من أهداف العمل الهامة:
- حماية تجربة المستخدم: تقوم بإنشاء شبكة أمان تمنع تراجعات الأداء من التأثير على المستخدمين.
- زيادة سرعة التطوير: من خلال توفير ملاحظات فورية، تمكّن المطورين من إصلاح المشكلات بسرعة وثقة، مما يقلل من دورات التحسين الطويلة والمؤلمة.
- اتخاذ قرارات مستنيرة بالبيانات: تقوم ببناء مجموعة بيانات غنية من اتجاهات الأداء التي يمكن أن توجه القرارات المعمارية وتبرر الاستثمارات في التحسين.
تبدأ الرحلة صغيرة. ابدأ بإضافة فحص Lighthouse CI بسيط إلى فرعك الرئيسي. حدد ميزانية أداء متحفظة. مع اعتياد فريقك على الملاحظات، قم بتوسيع تغطيتك لتشمل طلبات السحب، وأدخل مقاييس أكثر تفصيلاً، وابدأ في تحليل رحلات المستخدم الحاسمة. الأداء رحلة مستمرة، وليس وجهة. من خلال بناء خط أنابيب استباقي، تضمن أن كل سطر من الكود تقوم بشحنه يحترم أثمن أصول المستخدمين: وقتهم.